package com.qture.Demo;
/*
	匿名内部类：
		特点：
			1. 本质是类
			2. 内部类
			3. 该类没有名字（匿名）
			4. 同时还是一个对象

		说明：匿名内部类是定义在外部类的局部位置，比如方法中，并且没有类名。

		基本语法：
			new 类或者接口(参数列表){
				类体
			}

		1. 基于接口的匿名内部类
		2. 基于类的匿名内部类

*/
public class AnonymousInnerClassTest01 {
	public static void main(String[] args) {
		Outer o = new Outer();
		o.method();
	}
}

// 外部类
class Outer{
	private int n = 10;
	
	public void method() {
		// 需求：使用A接口，并创建对象，但是类只是使用一次，后续不再使用。
		
		// 传统方式：编写类，继承该接口，并创建对象。
//		A tiger = new Tiger();
//		tiger.cry();
		
		// 使用匿名内部类的方式
		// tiger的编译类型：A 	运行类型：匿名内部类 => Outer$1
		/*
			[底层]会创建匿名内部类 分配 类名 Outer$1
			class Outer$1 implements A{
				@Override
				public void cry() {
					System.out.println("老虎叫唤...");
				}
			}
		*/
		// 1. 基于【接口】的匿名内部类
		A tiger = new A() {
			@Override
			public void cry() {
				System.out.println("老虎叫唤...");
			}
		};
		System.out.println("tiger的运行类型：" + tiger.getClass());
		tiger.cry();


		// 2. 基于【类】的匿名内部类
		// father的编译类型：Father
		// father的运行类型：Outer$2
		/*
			[底层]会创建匿名内部类
			class Outer$2 extends Father{

			}
		*/
		Father father = new Father("jack"){
			@Override
			public void test() {
				System.out.println("匿名内部类重写了test方法");
			}
		};
		System.out.println("tiger的运行类型：" + father.getClass());
		father.test();
	}
}

// 接口
interface A {
	public void cry();
}

//class Tiger implements A {
//	@Override
//	public void cry() {
//		System.out.println("老虎叫唤...");
//	}
//}
//
//class Dog implements A {
//	@Override
//	public void cry() {
//		System.out.println("小狗汪汪叫...");
//	}
//}

class Father {
	public Father(String name) {}
	
	public void test() {}
}

